unit ulab5_4;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Grids;

const
   n_max = 15;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

 Tmas=array[0..n_max] of integer;

var
  Form1: TForm1;
  n:integer;

implementation

{ TForm1 }
{Обробник кнопки Введення}
procedure TForm1.Button1Click(Sender: TObject);
begin
     if edit1.Text=''then ShowMessage('Введіть n')
      else
         begin
           n:=strtoint(Edit1.Text);
           if (n<0)or(n>n_max)then ShowMessage('Недопустиме n')
           else
              begin
                StringGrid1.RowCount:=n;
                StringGrid1.ColCount:=n;
                StringGrid2.RowCount:=n;
                StringGrid2.ColCount:=n;
              end;
         end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

{Обробник кнопки Обчислення}
procedure TForm1.Button3Click(Sender: TObject);
Var	a: array[0..n_max] of Tmas;
        mod_max, i, j, k, st, max, temp, max_index: integer;
        stovbtsi: array of integer;
begin
{Введення початкових даних}
	for i:=0 to n-1 do
	   for j:=0 to n-1 do
	      a[i,j]:=StrToInt(StringGrid1.Cells[j,i]);

{Пошук найбільшого за модулем елемента матриці }
       mod_max:= abs(a[0,0]);
	for i:=0 to n-1 do
	   for j:=0 to n-1 do
	      if mod_max<abs(a[i,j]) then
                 mod_max:=abs(a[i,j]);

{Визначення кількость та індексів стовбців які містять найбільший за модулем елемент}
        k:=0;
	for j:=0 to n-1 do
	   for i:=0 to n-1 do
              if abs(a[i,j]) = mod_max then
              begin
                   k:=k+1;
                   SetLength(stovbtsi, k);
                   stovbtsi[k-1]:= j;
              end;

{Упорядковання за спаданням елементів стовпчиків, у яких розміщені найбільші
 за модулем елементи матриці методом вибору}
        for st:=0 to k-1 do
	   begin
           for i:=0 to n-1 do
              begin
                max:=a[i, stovbtsi[st]];
                max_index:=i;
                for j:=i+1 to n-1 do
                  if max < a[j, stovbtsi[st]] then
                  begin
                    max:= a[j, stovbtsi[st]];
                    max_index:=j;
                  end;
                temp:= a[i, stovbtsi[st]]; a[i, stovbtsi[st]]:= a[max_index, stovbtsi[st]];
                a[max_index, stovbtsi[st]]:=temp;
              end;
           end;

{Виведення перетвореної матриці }
  	for i:=0 to n-1 do
	   for j:=0 to n-1 do
	      StringGrid2.Cells[j,i]:=IntToStr(a[i,j]);

Finalize(stovbtsi);
end;

initialization
  {$I ulab5_4.lrs}

end.

